Technote 1131Creating Desktop Printers on the Fly
|
ÉtÉ@ÉCÉã |
É^ÉCÉv |
ÉNÉäÉGÅ[É^ |
LaserWriter 8 |
'PRER' |
'vgrd' |
StyleWriter 1200 |
'PRER' |
'dblo' |
StyleWriter 2500 |
'PRER' |
'auro' |
// -------------------------------------------------------------- // ÅgÉVÉXÉeÉÄã@î\ägí£ÅhÉtÉHÉãÉ_ì‡Ç≈éwíËÇ≥ÇÍÇΩç≈è¨ÉoÅ[ÉWÉáÉìÅAÉ^ÉCÉvÅA // ÉNÉäÉGÅ[É^ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇå©Ç¬ÇØÇ‹Ç∑ÅB // íçà”: DZÇÃÉãÅ[É`ÉìÇÕÉGÉâÅ[ÉRÅ[ÉhÇï‘ǵNjÇπÇÒÅBÉGÉâÅ[Ç™ãNDZǡÇΩèÍçáÅA // åƒÇ—èoǵë§Ç… C++ó·äOÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅB // åƒÇ—èoǵë§ÇÕ eofErr Çä‹ÇfiÉGÉâÅ[ÇèàóùÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB // eofErr ÇÕÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™å©Ç¬Ç©ÇÁǻǩǡÇΩDZÇΔÇé¶ÇµÇ‹Ç∑ÅB // ÉpÉâÉÅÅ[É^ÇÕéüÇÃí ÇËÇ≈Ç∑ÅB // inMinVersion - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃç≈è¨ÉoÅ[ÉWÉáÉìÇéwíË // inFileType - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉ^ÉCÉvÇéwíË // inCreator - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^ÇéwíË // outPrinterDrvrFsSpec - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇà FSSpec Ç™å©Ç¬Ç©Ç¡ÇΩèÍçáÅA // ǪÇÍÇï‘Ç∑ // -------------------------------------------------------------- void FindPrinterDriver(unsigned short inMinVersion, OSType inFileType, OSType inCreator void FSSpec& outPrinterDrvrFsSpec ) { OSErr err; const long kSearchBufSize = 16 * 1024; short savedResFile = CurResFile(); short startupVRefNum; long extDirID; // ägí£ã@î\ÉtÉHÉãÉ_ÇÃID CInfoPBRec targetPb; CInfoPBRec maskPb; CSParam catSearchPb; FSSpec foundFsSpec; StPointerBlock searchBuf(kSearchBufSize); // PBCatSearch ÇÃÉoÉbÉtÉ@ Boolean foundOne = false; Å@ err = FindFolder(-1, kExtensionFolderType, FALSE, &startupVRefNum, &extDirID); ThrowIfOSErr_(err); Å@ targetPb.hFileInfo.ioFlFndrInfo.fdType = inFileType; targetPb.hFileInfo.ioFlFndrInfo.fdCreator = inCreator; targetPb.hFileInfo.ioNamePtr = 0; targetPb.hFileInfo.ioFlAttrib = 0x00; // ÉtÉ@ÉCÉãÇÃÇ›åüçı targetPb.hFileInfo.ioFlParID = extDirID; // ã@î\ägí£ÉtÉHÉãÉ_ÇÃÇ› Å@ maskPb.hFileInfo.ioFlFndrInfo.fdType = 0xFFFFFFFF; maskPb.hFileInfo.ioFlFndrInfo.fdCreator = 0xFFFFFFFF; maskPb.hFileInfo.ioFlFndrInfo.fdFlags = 0; maskPb.hFileInfo.ioFlFndrInfo.fdLocation.h = 0; maskPb.hFileInfo.ioFlFndrInfo.fdLocation.v = 0; maskPb.hFileInfo.ioFlFndrInfo.fdFldr = 0; maskPb.hFileInfo.ioNamePtr = 0; maskPb.hFileInfo.ioFlAttrib = 0x10; // ÉfÉBÉåÉNÉgÉäÉrÉbÉg maskPb.hFileInfo.ioFlParID = extDirID; // ã@î\ägí£ÉtÉHÉãÉ_ÇÃÇ› Å@ Try_{ catSearchPb.ioCatPosition.initialize = 0; while(!foundOne ){ catSearchPb.ioCompletion = 0; catSearchPb.ioNamePtr = 0; catSearchPb.ioVRefNum = startupVRefNum; catSearchPb.ioMatchPtr = &foundFsSpec; catSearchPb.ioReqMatchCount = 1; catSearchPb.ioSearchBits = fsSBFlAttrib + fsSBFlFndrInfo + fsSBFlParID; catSearchPb.ioSearchInfo1 = &targetPb; catSearchPb.ioSearchInfo2 = &maskPb; catSearchPb.ioSearchTime = 0; catSearchPb.ioOptBuffer = (Ptr)searchBuf; catSearchPb.ioOptBufSize = kSearchBufSize; err = PBCatSearchSync(&catSearchPb); ThrowIfOSErr_(err); Å@ // éwíËÇÃÉ^ÉCÉvÇÃÉNÉäÉGÅ[É^ÇéùǬLJÇÃÇ™å©Ç¬Ç©Ç¡ÇΩ LFile thePrDrFile(foundFsSpec); Try_{ thePrDrFile.OpenResourceFork(fsRdPerm); // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉoÅ[ÉWÉáÉì StResource versRsrc('vers', 1, true, true); // ç≈è¨ÉoÅ[ÉWÉáÉìÇΔî‰är if(**(unsigned short **)(Handle)versRsrc >= inMinVersion){ // ÉoÅ[ÉWÉáÉìÇÃèåèÇÕçáív outPrinterDrvrFsSpec = foundFsSpec; foundOne = true; // ÉãÅ[ÉvÇî≤ÇØÇÈ } thePrDrFile.CloseResourceFork(); }Catch_(inErr){ thePrDrFile.CloseResourceFork(); // throw ǵǻǢ }EndCatch_ } // while }Catch_(inErr){ // ÉfÉtÉHÉãÉgÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ñflÇ∑ UseResFile(savedResFile); Throw_(inErr); }EndCatch_ } Å@
Å@
DZÇÃÉZÉNÉVÉáÉìÇ≈ÇÕÅALaserWriter à»äOÇÃÉvÉäÉìÉ^É^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÅAó·Ç¶ÇŒÅAStyleWriter ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoópÇà DTP ÇçÏê¨Ç∑ÇÈï˚ñ@Çè–âÓǵNjÇ∑ÅB
// --------------------------------------------------------------------------- // SetResource // DZÇÃÉãÅ[É`ÉìÇÕä˘ë∂ÇÃÉäÉ\Å[ÉXÇÃì‡óeÇÅAinNewContentH Ç™éwÇ∑êVǵǢ // ì‡óeÇ…ïœçXǵNjÇ∑ÅBDZÇÃÉãÅ[É`ÉìÇ™åƒÇ—èoÇ≥ÇÍÇÈëOÇ…ÅAÉ^Å[ÉQÉbÉgÇà // ÉäÉ\Å[ÉXÇÃì¸Ç¡ÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJǢǃÅAåªç›ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ… // ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB // --------------------------------------------------------------------------- void SetResource(ResType inResType, ResID inResID, Handle inNewContentH) { // ïœçXÇ∑ÇÈÉäÉ\Å[ÉXÇéÊÇËèoÇ∑ oldResH = Get1Resource(inResType, inResID); // ÉäÉ\Å[ÉXǙǻǢèÍçá (oldResH == 0) ÇÕÉGÉâÅ[èàóùÇÇ∑ÇÈDZÇΔ Å@ char savedInHdlState = HGetState(inNewContentH); char savedRsrcHdlState = HGetState(oldResH ); Size sz = GetHandleSize(inNewContentH); Å@ HUnlock(oldResH ); SetHandleSize(oldResH, sz); // ÉTÉCÉYÇçáÇÌÇπÇÈ ThrowIfMemError_(); HLock(oldResH ); HLock(inNewContentH); BlockMove(*inNewContentH, *oldResH, sz); // ì‡óeÇÉRÉsÅ[ Å@ HSetState(inNewContentH, savedInHdlState); HSetState(oldResH , savedRsrcHdlState); ChangedResource(oldResH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(oldResH); ThrowIfResError_(); UpdateResFile(CurResFile()); } // --------------------------------------------------------------------------- // SetStrResource // DZÇÃÉãÅ[É`ÉìÇÕä˘ë∂Çà 'STR ' ÉäÉ\Å[ÉXÇÃì‡óeÇ inStrP Ç™éwÇ∑ÅAêVǵǢì‡óeÇ… // ïœçXǵNjÇ∑ÅBÉ^Å[ÉQÉbÉgÇÃÉäÉ\Å[ÉXÇ™ì¸Ç¡ÇƒÇ¢ÇÈÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÅADZÇà // ÉãÅ[É`ÉìÇ™åƒÇ—èoÇ≥ÇÍÇÈëOÇ…äJǢǃÅAåªç›ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ê›íËÇµÇ»ÇØ // ÇÍnjǻÇËÇ‹ÇπÇÒÅBä˘ë∂ÇÃÉäÉ\Å[ÉXÇ™è¨Ç≥Ç≠Ç»ÇÈÇÃÇñhÇÆï˚ñ@Ç…ì¡Ç…íçà”ǵǃ // å©ÇƒÇ≠ÇæÇ≥Ç¢ÅB // --------------------------------------------------------------------------- void SetStrResource(ResType inResType, ResID inResID, ConstStringPtr inStrP ) { // ïœçXÇ∑ÇÈÉäÉ\Å[ÉXÇéÊÇËèoÇ∑ oldResH = Get1Resource(inResType, inResID); // ÉäÉ\Å[ÉXǙǻǢèÍçá (oldResH == 0) ÇÕÉGÉâÅ[èàóùÇÇ∑ÇÈDZÇΔ Å@ Size sz = *inStrP + 1; /* ï∂éöóÒÇ™ÉnÉìÉhÉãÇÊÇËí∑ÇØÇÍÇŒÅAÉnÉìÉhÉãÇëÂÇ´Ç≠Ç∑ÇÈ */ if(sz > GetHandleSize(oldResH )){ char savedRsrcHdlState = HGetState(oldResH ); HUnlock(oldResH ); SetHandleSize(oldResH , sz); ThrowIfMemError_(); HSetState(oldResH , savedRsrcHdlState); } BlockMoveData(inStrP, *oldResH , sz); ChangedResource(oldResH ); WriteResource(oldResH); ThrowIfResError_(); UpdateResFile(CurResFile()); }
ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕÅgFinder ã@î\ägí£ÅhÇΔǵǃé¿ëïÇ≥ÇÍǃǢÇÈÇΩÇflÅAí êMÇçsǧÇΩÇflÇ…ÇÕ Finder Ç…àÀóäÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBéüÇÃÉãÅ[É`ÉìÇÕDZÇÃñ⁄ìIÇíBê¨Ç∑ÇÈÇΩÇflÇ…ïKóvǻLJÇÃÇ≈Ç∑ÅB
// --------------------------------------------------------------------------- // ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÇΩÇ¢ Finder ÇÃÉAÉhÉåÉXÇçÏê¨ÇµÇ‹Ç∑ÅB // DZDZÇ≈ÇÃÅuFinderÅvÇÕç≈LJàÍî ìIÇ»à”ñ°Ç≈égǡǃǢÇÈDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB // é¿ç€Ç…ÇÕÅAFinder ÇΔ AtEase Çà”ñ°ÇµÇ‹Ç∑ÅB // --------------------------------------------------------------------------- OSStatus getFinderAddress(AEAddressDesc *theDesc) { OSErr result = noErr; ProcessInfoRec processInfo; ProcessSerialNumber serialNumber; Å@ serialNumber.highLongOfPSN = 0; serialNumber.lowLongOfPSN = kNoProcess; while ((result = GetNextProcess(&serialNumber)) == noErr) { processInfo.processInfoLength = sizeof(ProcessInfoRec); processInfo.processName = nil; processInfo.processAppSpec = nil; Å@ result = GetProcessInformation(&serialNumber, &processInfo); if (result == noErr){ if ( processInfo.processType == 'FNDR' ){ result = AECreateDesc(typeProcessSerialNumber, (Ptr)&serialNumber, sizeof(ProcessSerialNumber), theDesc); return(result); } } } return(result); } Å@ // --------------------------------------------------------------------------- // ÉAÉbÉvÉãÉCÉxÉìÉgÇ Finder Ç…ëóÇËÇ‹Ç∑ÅBÉCÉxÉìÉgÉfÅ[É^ÇÕ 'dataPtr' Ç™éwǵÅA // ǪÇÃí∑Ç≥ÇÕ 'dataSize' ÉoÉCÉgÇ≈Ç∑ÅBÉfÅ[É^ÇÕ Finder Ç™ì‡óeÇâéflÇ≈Ç´ÇÈÇÊǧ // ÉfÅ[É^Ç…ÇÕÉTÉuÉ^ÉCÉvÇó^ǶNjÇ∑ÅB // --------------------------------------------------------------------------- #define kFinderExtension 'fext' static OSStatus sendAEToFinder( Ptr dataPtr, Size dataSize) { OSStatus err = noErr; // ÉAÉbÉvÉãÉCÉxÉìÉgÉfÉXÉNÉäÉvÉ^Ç… Finder ÇÃÉAÉhÉåÉXÇéwíË AEAddressDesc finderAddr; AppleEvent theEvent; AppleEvent replyEvent; Å@ err = getFinderAddress(&finderAddr); if (err == noErr) { err = AECreateAppleEvent( kCoreEventClass, // ÉRÉAÉCÉxÉìÉgÇçÏê¨ kFinderExtension, // Finder ã@î\ägí£ÇÃÉCÉxÉìÉg &finderAddr, // DZÇÍÇ Finder Ç…ëóÇÈ kAutoGenerateReturnID, // ï‘ÇËílÇÕéÊìæÇµÇ»Ç¢ kAnyTransactionID, // ÉgÉâÉìÉUÉNÉVÉáÉìî‘çÜÇÕñ≥éã &theEvent); // DZDZDžÇ∑ÇÆçÏê¨ if (err == noErr) { err = AEPutParamPtr( &theEvent, // ìnÇ∑ÉCÉxÉìÉg keyDirectObject, // É_ÉCÉåÉNÉgÉIÉuÉWÉFÉNÉgÉLÅ[ÉèÅ[Éh kFinderExtension, // Finder ägí£ã@î\Ç…ëóÇÈ dataPtr, // DZÇÍÇ™ÉfÅ[É^ dataSize); // DZÇÍǙǪÇÃí∑Ç≥ Å@ if (err == noErr) { err = AESend( &theEvent, // ÉXÉeÅ[É^ÉXÉCÉxÉìÉgÇëóÇÈ &replyEvent, // ÉäÉvÉâÉCÉCÉxÉìÉgÇÕǻǵÅAÇ»Ç∫Ç»ÇÁ... kAENoReply + // ÉäÉvÉâÉCÇÕïsóvÅA kAECanInteract + // éÛêMé“ÇÕÉÜÅ[ÉUÇΔëŒòbâ¬î\Ç≈ÅA kAEDontReconnect, // ÉGÉâÅ[Ç™î≠ê∂ǵǃLJçƒê⁄ë±ÇµÇ»Ç¢Ç©ÇÁÅB kAENormalPriority, // í èÌÉCÉxÉìÉg kAEDefaultTimeout, // àÍíËéûä‘ë“Ǭ nil, nil); // ìÆçÏÇÃåãâ ÇÕñ≥éã } Å@ // DZDZÇ≈ÉAÉbÉvÉãÉCÉxÉìÉgÇâï˙ (void) AEDisposeDesc(&theEvent); } Å@ // DZDZÇ≈ Finder ÉAÉhÉåÉXÇâï˙ (void) AEDisposeDesc(&finderAddr); } Å@ // DZDZNjÇ≈óàÇÈÅBÉGÉâÅ[Ç (džÇÍÇŒ) ï‘Ç∑ÅB return(err); }
ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕêVǵÇ≠ëIëÇ≥ÇÍÇΩåªç›ÇÃÉvÉäÉìÉ^Çé©ìÆìIÇ…åüèoÇ≈Ç´Ç‹Ç∑Ç™ÅADZÇÍÇÕãÛÇ´éûä‘Ç…ä÷òAÉäÉ\Å[ÉXÇÉ`ÉFÉbÉNÇ∑ÇÈDZÇΔÇ…ÇÊǡǃçsǢNjÇ∑ÅBDZÇÍÇ…é·ä±ÇÃéûä‘ǙǩǩÇÈèÍçáǙdžÇËÇ‹Ç∑ÅBåüèoÇ‹Ç≈ÇÃéûä‘ÇíZèkÇ∑ÇÈÇ…ÇÕÅAéüÇÃÉãÅ[É`ÉìÇ≈ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÅAêVǵǢÉvÉäÉìÉ^ÇÃí«â¡Ç™Ç†Ç¡ÇΩDZÇΔÇí ímÇ∑ÇÈÇΔÇÊÇ¢Ç≈ǵÇÂǧÅB
// --------------------------------------------------------------------------- // nessieCreateDTP // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÅA // åªç›ÇÃÉvÉäÉìÉ^Ç…ëŒâûÇ∑ÇÈêVǵǢ DTP ÇÃçÏê¨ÇàÀóäǵNjÇ∑ÅB // --------------------------------------------------------------------------- #define kPrintingExtension 'dtpx' #define aePFECreateDTP 'pfcr' typedef struct { OSType pfeCreator; OSType extensionType; } CreateDTPEvent; Å@ // --------------------------------------------------------------------------- // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÅ^Finder Ç…åªç›ÇÃÉvÉäÉìÉ^Ç™ïœçXÇ… // ǻǡÇΩDZÇΔÇí ímǵNjÇ∑ // --------------------------------------------------------------------------- OSStatus nessieCreateDTP() { OSStatus err; CreateDTPEvent myEvent; Å@ myEvent.pfeCreator = kPrintingExtension; myEvent.extensionType = aePFECreateDTP; // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕ Finder ã@î\ägí£Ç≈džÇÈÇΩÇfl err = sendAEToFinder((Ptr) &myEvent, sizeof(myEvent)); return err; }
åªç›ÇÃÉvÉäÉìÉ^ÇéwíËÇ∑ÇÈÉäÉ\Å[ÉXÇê≥ǵÇ≠ê›íËǵÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ÷ÇÃí ímÇ™çsÇ¡ÇΩå„ÅAÇ≥ÇÁÇ… DTP Ç™é¿ç€Ç…çÏê¨Ç≥ÇÍÇΩǩǫǧǩÇí≤Ç◊Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÃÇΩÇflÅADTPInfo ÉfÅ[É^ç\ë¢ëÃÇégópǵNjÇ∑ÅB
typedef struct DTPInfo{ short vRefNum; // DTP ÉtÉHÉãÉ_Çà vRefNum long dirID; // DTP ÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉä ID Str31 DTPName; // DTP ÉtÉHÉãÉ_ÇÃñºëO OSType driverType; // DZÇà DTP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉv Boolean current; // DZÇà DTP ÇÕåªç›ÉfÉtÉHÉãÉgÉvÉäÉìÉ^ǩǫǧǩ Str32 printerName; // ÉlÉbÉgè„ÇÃé¿ç€ÇÃÉvÉäÉìÉ^ñº (LW8.4 ÇÃÇ›) Str32 zoneName; // ÉvÉäÉìÉ^ÇÃdžÇÈÉ]Å[Éì (LW8.4 ÇÃÇ›) } DTPInfo, *DTPInfoPtr, **DTPInfoHdl;
DTP DžǬǢǃÇÃèÓïÒÇéÊìæÇ∑ÇÈï˚ñ@ÇÕÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ÷Çà Gestalt åƒÇ—èoǵÇçsǧDZÇΔÇ≈Ç∑ÅBGestalt åƒÇ—èoǵÇÕ DTPInfo ÇÃÉäÉXÉgÇï‘ǵNjÇ∑ÅBÉäÉXÉgì‡ÇÃäe DTPInfo ÉåÉRÅ[ÉhÇÕǪÇÍǺÇÍ 1 å¬Çà DTP ÇãLèqǵNjÇ∑ÅBÉäÉXÉgÇíHǡǃå¬ÅXÇà DTPInfo ÇÃì‡óeÇí≤Ç◊ÅAäÛñ]Çà DTP Ç™çÏê¨Ç≥ÇÍǃǢÇÈÇ©Çí≤Ç◊ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBéüÇÃÉãÅ[É`ÉìÇÕǪÇÃï˚ñ@Çê‡ñæÇµÇΩLJÇÃÇ≈Ç∑ÅB
#define errDTPNotFound -1 #define kGestaltPFEInfo 'dtpx' enum { kOldPFEGestaltStructVersion = 0x02008000, // ÉoÅ[ÉWÉáÉì 2.0f0 (Mac OS 8.0ÅA8.1ÅA7.x) kPFEGestaltStructVersion = 0x03000000 // ÉoÅ[ÉWÉáÉì 3.0 (Allegro) }; // GestaltDTPInfo typedef struct { short vRefNum; // DTP ÉtÉHÉãÉ_Çà vRefNum long dirID; // DTP ÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉä ID Str31 dtpName; // DTP ÉtÉHÉãÉ_ OSType driverType; // DZÇà DTP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉv Boolean current; // DZÇà DTP ÇÕåªç›ÉfÉtÉHÉãÉgÉvÉäÉìÉ^Ç© Str32 printerName; // ÉlÉbÉgè„ÇÃé¿ç€ÇÃÉvÉäÉìÉ^ÇÃñºëO (LaserWriter 8 DTP ÇÃÇ›) Str32 zoneName; // DZÇÃÉvÉäÉìÉ^ÇÃdžÇÈÉ]Å[Éì (LaserWriter 8 DTP ÇÃÇ›) } GestaltDTPInfo, *GestaltDTPInfoPtr; // data associated with the pfe gestalt typedef struct { long version; // kPFEGestaltStructVersion short numDTPs; // ÉAÉNÉeÉBÉuÇ» DTP ÇÃå¬êî Handle theDTPList; // ÉAÉNÉeÉBÉuÇ» DTP Çà GestaltDTPInfo ÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã Handle theDTPDriverList; // ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉXÉyÉbÉNÇÃÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã Handle theDTPMoreInfoList; // ÉAÉbÉvÉãÇÃì‡ïîégópÇÃÇ› } GestaltPFEInfo, **GestaltPFEInfoHdl; Å@ // --------------------------------------------------------------------------- // DTP ÇÃÉäÉXÉgÇíHÇËÅAÉlÉbÉgÉèÅ[ÉNÉAÉhÉåÉXÇ™ 'papaH'ÅA // ÉtÉ@ÉCÉãÉXÉyÉbÉNÇ™ *printerDrvrFsSpecP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoDždžÇΩÇÈ // ÉvÉäÉìÉ^ÇãLèqÇ∑ÇÈ DTP ÇíTǵNjÇ∑ÅB // papaH ÇÕ NULL ÇæÇΔñ≥éãǵNjÇ∑ÅB // printerDrvrFsSpecP ÇÕ NULL ÇæÇΔñ≥éãǵNjÇ∑ÅB // // àÍívÇ∑ÇÈLJÇÃÇ™å©Ç¬Ç©Ç¡ÇΩÇÁÅAnoErr Çï‘ǵNjÇ∑ÅB // àÍívÇ∑ÇÈLJÇÃÇ™å©Ç¬Ç©ÇÁǻǢèÍçáÇÕÅAÉGÉâÅ[Çï‘ǵNjÇ∑ÅB // åƒÇ—èoǵë§Ç™àÍívǵÇΩÉvÉäÉìÉ^DžǬǢǃÇÃèÓïÒǙǟǵǢèÍçáÇÕÅA // *'DTPInfoP' Ç…ÇÕ NULL à»äOÇÃílÅAǬNjÇË DTPInfo ç\ë¢ëÃÇäÑÇËìñǃǃ // ǪÇÃóÃàÊÇéwÇ∑É|ÉCÉìÉ^ÇìnǵǃÇ≠ÇæÇ≥Ç¢ÅB // --------------------------------------------------------------------------- OSStatus nessieFindDTP(Handle papaH, FSSpec *printerDrvrFsSpecP, DTPInfo *DTPInfoP) { DTPInfoPtr found = NULL; GestaltPFEInfoHdl gestaltResponse; char papaHState; OSStatus err; Å@ if(papaH){ papaHState = HGetState(papaH); HLock(papaH); } Å@ err = Gestalt(kGestaltPFEInfo, (long *)&gestaltResponse); if(!err && gestaltResponse != NULL){ int numDTPs = (*gestaltResponse)->numDTPs; DTPInfoHdl DTPH = (*gestaltResponse)->theDTPList; FSSpec** driverH = (*gestaltResponse)->theDTPDriverList; Å@ err = errDTPNotFound; if((numDTPs > 0) && (DTPH != NULL) && (driverH != NULL)){ DTPInfoPtr DTP; FSSpec *driverP; char DTPState = HGetState((Handle)DTPH); char driverListState = HGetState((Handle)driverH); HLock((Handle)DTPH); HLock((Handle)driverH); DTP = *DTPH; driverP = *driverH; if((DTP != NULL) && (driverP != NULL)){ StringPtr printerStr; // ÉvÉäÉìÉ^ñºÇ÷ÇÃÉ|ÉCÉìÉ^ StringPtr zoneStr; // É]Å[ÉìñºÇ÷ÇÃÉ|ÉCÉìÉ^ // (ç≈èâÇÕÉIÉuÉWÉFÉNÉgÉ^ÉCÉvÇèúäO) int i; if(papaH){ printerStr = (StringPtr)*papaH; // ÉvÉäÉìÉ^ñºÇ÷ÇÃÉ|ÉCÉìÉ^ zoneStr = printerStr + *printerStr + 1; // É]Å[ÉìñºÇ÷ÇÃÉ|ÉCÉìÉ^ // (ç≈èâÇÕÉIÉuÉWÉFÉNÉgÉ^ÉCÉvÇèúäO) zoneStr += *zoneStr + 1; // É]Å[ÉìñºÇê›íË } Å@ for(i = 0; i < numDTPs && found == NULL; ++i, ++DTP, ++driverP){ // íTǵǃǢÇÈ DTP ÇÕÅAéwíËÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ≈çÏê¨Ç≥ÇÍǃǮÇËÅA // É]Å[ÉìñºÇΔÉvÉäÉìÉ^ñºÇ™çáívÇ∑ÇÈLJÇà if(papaH){ if(((printerDrvrFsSpecP == NULL) || ((printerDrvrFsSpecP->vRefNum == driverP->vRefNum) && (printerDrvrFsSpecP->parID == driverP->parID) && (EqualString(printerDrvrFsSpecP->name, driverP->name, false, false)))) && Å@ EqualString(printerStr, DTP->printerName, false, false) && EqualString(zoneStr, DTP->zoneName, false, false)){ found = DTP; } }else{ if((printerDrvrFsSpecP != NULL) && ((printerDrvrFsSpecP->vRefNum == driverP->vRefNum) && Å@ (printerDrvrFsSpecP->parID == driverP->parID) && (EqualString(printerDrvrFsSpecP->name, driverP->name, false, false)))){ found = DTP; } } } if(found != NULL){ if(DTPInfoP) *DTPInfoP = *found; } } HSetState((Handle)driverH, driverListState); HSetState((Handle)DTPH, DTPState); } } Å@ if(papaH) HSetState(papaH, papaHState); Å@ return found == NULL ? errDTPNotFound : noErr; } Å@ // --------------------------------------------------------------------------- // DZÇÃÉãÅ[É`ÉìÇÕÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇà FSSpec ÇéÛÇØéÊÇËÅA // äYìñÇ∑ÇÈ DTP Ç™ë∂ç›Ç∑ÇÈǩǫǧǩÇí≤Ç◊Ç‹Ç∑ÅB // --------------------------------------------------------------------------- Boolean HasDTP(DTPInfo *DTPInfoP, FSSpec *prDriverFsSpecP) { OSStatus err; Å@ err = nessieFindDTP(NULL, prDriverFsSpecP, DTPInfoP); return(!err); }
DZÇÍÇ‹Ç≈Ç…è–âÓǵÇΩÉãÅ[É`ÉìÇÃèïÇØÇéÿÇËǃÅADZÇÍÇ©ÇÁç≈èâÇà DTP ÇçÏê¨ÇµÇ‹Ç∑ÅBDZÇÃÉTÉìÉvÉãÇ™é¶Ç∑ÇÃÇÕÅALaserWriter à»äOÇÃÉ^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoóp DTP ÇÃçÏê¨ï˚ñ@Ç≈Ç∑ÅBLaserWriter (LW) DTP ÇÃèÍçáÇÕÅALaserWriterExtra() ÇΔǢǧÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ïKóvǙdžÇËÅADZDZÇ≈ÇÕÉRÉÅÉìÉgDžǵǃäOǵǃdžÇËÇ‹Ç∑ÅB(è⁄ç◊DžǬǢǃÇÕÅuLaserWriterÅvÇÃÉZÉNÉVÉáÉìÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB)
ä¬ã´ÇÃämîFå„ÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃèÍèäÇí≤Ç◊Ç‹Ç∑ÅBǪÇÍÇ©ÇÁÅAÅgSystemÅhÉtÉ@ÉCÉãì‡ÇÃåªç›ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇéwíËÇ∑ÇÈ 2 ǬÇÃÉäÉ\Å[ÉXÇïœçXǵÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhDžǪÇÃïœçXÇí ímǵÅAêVǵǢ DTP Ç™çÏê¨Ç≥ÇÍÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBë“ÇøÉãÅ[ÉvÇ≈ÇÃìÆçÏÇ…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅBÉãÅ[Évì‡Ç≈ÇÕÅAEventAvail Ç‹ÇΩÇÕ WaitNextEvent Ç≈ Finder Ç…êßå‰ÇìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇǵǻǢÇΔÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÅ^Finder ÇÕ DTP ÇçÏê¨Ç∑ÇÈã@âÔÇéùǬDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅB
#define kWaitForDTPTime (60 * 20) // --------------------------------------------------------------------------- // CreateDTP // DZÇÃÉãÅ[É`ÉìÇÕ StyleWriter1200 óp DTP ÇÃçÏê¨ï˚ñ@Çé¶ÇµÇ‹Ç∑ÅB // --------------------------------------------------------------------------- void CreateDTP() { OSErr err; short savedResFile = CurResFile(); FSSpec printerDriverFSSpec; AliasHandle theAlias; EventRecord eventRec; unsigned long endTime = TickCount() + kWaitForDTPTime; DTPInfo DTPInfo; Å@ // ä¬ã´ÇÃÉ`ÉFÉbÉNÅB // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ®ÇÊÇ— // ÅgFinder ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÅhǙdžÇÈDZÇΔÇämîF if(HasDesktopExtension() && HasFinderScripting()){ Try_{ FindPrinterDriver(0x0120, 'PRER', 'dblo', FSSpec& // StyleWriter1200 printerDriverFSSpec); Å@ /* LaserWriter É^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇà DTP ÇçÏê¨Ç∑ÇÈÇ…ÇÕÅA DZDZDžÉRÅ[ÉhÇ™èëÇ≠ïKóvǙdžÇÈÅB ǪÇÃèÍçáÇÕéüÇåƒÇ—èoÇ∑ Å® LaserWriterExtra(); */ Å@ UseResFile(0); // ÉVÉXÉeÉÄÉtÉ@ÉCÉã // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉGÉCÉäÉAÉXÇçÏê¨ err = NewAlias(nil, &printerDriverFSSpec, &theAlias); ThrowIfOSErr_(err); // åªç›ÇÃÉvÉäÉìÉ^ÇäYìñÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ê›íË SetResource('alis', -8192, theAlias); SetStrResource('STR ', -8192, printerDriverFSSpec.name); DisposeHandle(theAlias); Å@ // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉfÉtÉHÉãÉg // ÉvÉäÉìÉ^ÇÃïœçXÇí ím err = nessieCreateDTP(); // DTP Ç™çÏê¨Ç≥ÇÍÇΩǩǫǧǩämîF do{ // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ… // DTP çÏê¨óvãÅÇèàóùÇ∑ÇÈã@âÔÇó^ǶÇÈ EventAvail(everyEvent, &eventRec); newDTPMade = HasDTP(&DTPInfo, &printerDriverFSSpec); }while((TickCount() < endTime) && (newDTPMade == FALSE)); // DTP Ç™çÏê¨Ç≥ÇÍÇÈÇ©É^ÉCÉÄÉAÉEÉgÇ∑ÇÈÇ‹Ç≈ }Catch_(inErr){ // ÉGÉâÅ[èàóù }EndCatch_ } UseResFile(savedResFile); } Å@
LaserWriter ópÇà DTP ÇçÏê¨Ç∑ÇÈÉRÅ[ÉhÇèëÇ≠èÍçáÇÕÅACreateDTP() ÉãÅ[É`ÉìÇ…è≠ǵïœçXÇâ¡Ç¶ÇÈÇæÇØÇ≈ëÂè‰ïvÇ≈Ç∑ÅB
FindPrinterDriver ÇåƒÇ—èoÇ∑ÇΔDZÇÎÇ≈ÅAStyleWriter ópÇÃÉNÉäÉGÅ[É^ÇÃë„ÇÌÇËÇ…ÅALaserWriter ÇÃÉNÉäÉGÅ[É^ÇìnǵNjÇ∑ÅBè„ÇÃÉTÉìÉvÉãÇ≈ÇÕÉRÉÅÉìÉgÇ≈èúäOǵǃdžǡÇΩ LaserWriterExtra() ÉãÅ[É`ÉìLJåƒÇ—èoǵǃÇ≠ÇæÇ≥Ç¢ÅBLaserWriterExtra() ÇÕÅALaserWriter ÉvÉäÉìÉ^ÉhÉâÉCÉoì‡Çà 'PAPA' -8192 ÉäÉ\Å[ÉXÇïœçXǵǃÅAêVǵǢÉvÉäÉìÉ^ÇéwÇ∑ÇÊǧDžǵNjÇ∑ÅB
LaserWriterExtra() ÉãÅ[É`ÉìÇÕÅALaserWriter 8.5.1 ÇΔǪÇÍÇÊÇËëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕàŸÇ»ÇËÇ‹Ç∑ÅB8.5.1 ÇÃèÍçáÇÕ DTP ÇÃÉ^ÉCÉvÇ…ÇÊǡǃÇ≥ÇÁÇ…à·Ç¢Ç™Ç†ÇËÇ‹Ç∑ÅB
Å@
8.5.1 ÇÊÇËëOÇà LaserWriter Ç≈ÇÕÅAAppleTalk (PAP) DTP ǵǩçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBÉhÉâÉCÉoÇ™ÉIÉäÉWÉiÉãÇà 103 ÉoÉCÉgí∑Çà 'PAPA' ǵǩÉTÉ|Å[ÉgǵǻǢÇΩÇflÇ≈Ç∑ÅBLaserWriterExtra() ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB
Å@
// --------------------------------------------------------------------------- // 8.5.1 ÇÊÇËëOÇà LaserWriter óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inZone, ConstStr32Param inPrinterName) { OSErr err; char papaState; short refNum; Handle papaH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ papaState = HGetState(papaH); HLock(papaH); // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX NBPSetEntity(*papaH, (ConstStr32Param)StringPtr(inPrinterName), (ConstStr32Param)("\pLaserWriter"), (ConstStr32Param)inZone); Å@ HSetState(papaH, papaState ); ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); }
Å@
LaserWriter 8.5.1 ÇÕägí£ PAPA (1024 ÉoÉCÉgí∑) ÇÉTÉ|Å[ÉgǵNjÇ∑ÅBägí£ PAPA ÇégǧÇΔÅAÉIÉäÉWÉiÉãÇà AppleTalkÅuPAPÅvÉvÉäÉìÉ^Ç…â¡Ç¶ÇƒÅAàŸÇ»ÇÈÉ^ÉCÉvÇÃâºëzÇ‹ÇΩÇÕï®óùÉvÉäÉìÉ^Çï\Ç∑ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBàŸÇ»ÇÈÉ^ÉCÉvÇà DTP Ç…àÛç¸Ç∑ÇÈÇΔà·Ç§åãâ Çê∂Ç∂Ç‹Ç∑ÅBÅuï€óØÅvDTP ÇÕÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇéÛÇØïtÇØÇÈÇæÇØÇÃÉvÉäÉìÉ^Ç≈Ç∑ÅBÅuPostScript ÉgÉâÉìÉXÉåÅ[É^ÅvDTP ÇÕàÛç¸ï∂èëÇ PostScript ï∂èëÇ…ïœä∑Ç∑ÇÈLJÇÃÇ≈Ç∑ÅBÅuÉJÉXÉ^ÉÄÅvDTP ÇÕÅAdžÇÁÇ©Ç∂ÇfléwíËÇ≥ÇÍÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÅAïœä∑çœÇ›Çà PostScript ï∂èëÇäJÇ≠ÇÊǧñΩÇ∂ÇÈLJÇÃÇ≈Ç∑ÅBÅuLPRÅvDTP ÇÕ LPR ÉvÉçÉgÉRÉãÇóùâÇ∑ÇÈÉvÉäÉìÉ^Å^ÉXÉvÅ[ÉâÇ…àÛç¸ÇçsǢNjÇ∑ÅBÅuê‘äOê¸ÅvDTP ÇÕê‘äOê¸í êMÉ|Å[ÉgÇéùǬ LaserWriter Ç…àÛç¸ÇµÇ‹Ç∑ÅBägí£ PAPA ÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1115: ägí£ 'PAPA' ÉäÉ\Å[ÉXÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
PrintingLib Ç…ÇÕÅAÉvÉçÉOÉâÉ}Ç™ì‡ïîç\ë¢ÇóùâǵǻÇ≠ǃLJägí£ PAPA ÇçÏê¨Ç≈Ç´ÇÈÉãÅ[É`ÉìǙdžÇËÇ‹Ç∑ÅBè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1129: ÉvÉäÉìÉ^ê›íËÉâÉCÉuÉâÉäÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
LaserWriter ÉhÉâÉCÉoÇà PAPA ÉäÉ\Å[ÉXÇïœçXǵǃ DTP ÇçÏê¨Ç∑ÇÈëOÇ…ÅADTP ÇäÆëSÇ…ãLèqÇ∑ÇÈí«â¡ÇÃÉpÉâÉÅÅ[É^Çê›íËÇ∑ÇÈïKóvLJdžÇËÇ‹Ç∑ÅBåªç›íËã`Ç≥ÇÍǃǢÇÈ DTP ópÇÃÉpÉâÉÅÅ[É^ÇÃó·ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉCÉvÇà DTP Ç≈ïKóvÇ» PPD ÉtÉ@ÉCÉãÅALPR DTP ÇÃÉhÉÅÉCÉìÉAÉhÉåÉXÅAÉgÉâÉìÉXÉåÅ[É^ DTP ÇÃäiî[êÊÉtÉHÉãÉ_ÅAÉJÉXÉ^ÉÄ DTP ÇÃå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìǙdžÇËÇ‹Ç∑ÅB
ÉpÉâÉÅÅ[É^ÇÕéüÇÃï\ÇÃí ÇËÇ≈Ç∑ÅB
Collection Tag |
Tag ID |
DTP Type |
parameter |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
ÉhÉÅÉCÉìÉAÉhÉåÉX |
|
|
|
ÇÃê›íË |
|
|
|
ÉGÉCÉäÉAÉX |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DZÇÍÇÁÇÃÉpÉâÉÅÅ[É^ÇÕÉRÉåÉNÉVÉáÉìì‡Ç…ÉqÉìÉgÇΔǵǃï€ä«Ç≥ÇÍÅAå„Ç… LaserWriter ÇÃê›íËÉtÉ@ÉCÉãÇ…ï€ë∂Ç≥ÇÍÇ‹Ç∑ÅBÉqÉìÉgÇÕÉRÉåÉNÉVÉáÉìÉ^ÉOÇΔ ID Ç…ÇÊǡǃéØï Ç≥ÇÍÇ‹Ç∑ÅBäeÉpÉâÉÅÅ[É^ÇÃà”ñ°ÇΔÉfÅ[É^ç\ë¢ÇÕDZÇÍÇÁÇégópÇ∑ÇÈÉZÉNÉVÉáÉìÇ≈è⁄ǵÇ≠ê‡ñæÇµÇ‹Ç∑ÅB
PrintingLib Ç…ÇÕDZÇÍÇÁÇÃÉRÉåÉNÉVÉáÉìÇ…ÉAÉNÉZÉXÇ∑ÇÈÉãÅ[É`ÉìǙdžÇËÇ‹Ç∑ÅBè⁄ç◊DžǬǢǃÇÕÅAê›íËÉâÉCÉuÉâÉä (SettingsLib) ÇÃÉhÉLÉÖÉÅÉìÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBÉRÉåÉNÉVÉáÉìÇ…ÉAÉNÉZÉXÇ∑ÇÈèÍçáÇÕïKÇ∏DZÇÍÇÁÇÃÉãÅ[É`ÉìÇégópǵǃÇ≠ÇæÇ≥Ç¢ÅBÉãÅ[É`ÉìÇÃǻǩDžÇÕÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃê›íËÉtÉ@ÉCÉãÇÃñºëOÇïKóvÇΔÇ∑ÇÈLJÇÃǙdžÇËÇ‹Ç∑ÅBLaserWriter ÇÃèÍçáÅAê›íËÉtÉ@ÉCÉãÇÃñºëOÇÕ LaserWriter ÉtÉ@ÉCÉãÇà 'STR ' ÉäÉ\Å[ÉXÅAID -8185 Ç…ï€ë∂Ç≥ÇÍǃǢNjÇ∑ÅB
DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…ÉqÉìÉgÇí«â¡Ç∑ÇÈÉãÅ[É`ÉìÇÕÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB
#define kNoCollection -2 OSErr psStorePrinterName(Collection prInfo, Handle papa); /* ÉRÉåÉNÉVÉáÉì prInfo Ç…ê≥ãKâªÇµÇΩ EntityName Çï€ë∂Ç∑ÇÈ */ Å@ /* DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…ÉqÉìÉgÇí«â¡ÇµÇ‹Ç∑ÅB í∑Ç≥Ç™ 'size' Ç≈ 'bufP' ÇÃéwÇ∑ÉÅÉÇÉäÉuÉçÉbÉNÇÅA'tag' ÇΔ 'id' ÇéùǬÉqÉìÉgÇΔǵǃÅA 'papaH' ÇÃéwíËÇ∑ÇÈ PAPA ÇéùǬ DTP Ç…í«â¡ÇµÇ‹Ç∑ÅB íçà”: DZÇÃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ëOÇ…ÅALaserWriter ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJǢǃǮǩǻÇ≠ǃÇÕÇ»ÇËÇ‹ÇπÇÒÅB */ OSErr addHint(Handle papaH, CollectionTag tag, long id, long size, void *bufP){ Å@ Handle lwPrefFileNameH; char savedHandleState; Collection DTPCollection; Å@ // LW ÇÃê›íËÉtÉ@ÉCÉãÇÃñºëOÇ™ïKóv lwPrefFileNameH= GetString(-8185 ); // ÉGÉâÅ[èàóùÇñYÇÍǻǢÇÊǧDž savedHandleState = HGetState(inHandle); HLock(lwPrefFileNameH); // SettingsLib ÇÃÉãÅ[É`ÉìÇ≈ÉRÉåÉNÉVÉáÉìÇéÊìæÇµçÄñ⁄Çí«â¡Ç∑ÇÈ DTPCollection= psGetPrefsPrinterInfo((StringPtr)(*lwPrefFileNameH), papaH); if(DTPCollection== nil) // ÉGÉâÅ[èàóùÇñYÇÍǻǢÇÊǧDž err = kNoCollection; Å@ err = psStorePrinterName(DTPCollection, papaH); // ÉGÉâÅ[èàóù err = AddCollectionItem(DTPCollection, tag, id, size, bufP); // ÉGÉâÅ[èàóù err = psUpdatePrefsPrinterInfo(*lwPrefFileNameH, papaH, DTPCollection); DisposeCollection(DTPCollection); // å„énññ HSetState(lwPrefFileNameH, savedHandleState ); ReleaseResource(lwPrefFileNameH); return (err); }
Å@
Ç∑Ç◊ǃÇÃÉ^ÉCÉvÇà DTP Ç…ëŒÇµÇƒ PPD ÉtÉ@ÉCÉãÇéwíËÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBéüÇÃÉãÅ[É`ÉìÇÕǪÇÃï˚ñ@Ç≈Ç∑ÅB
OSStatus psGetPPDInfo(FSSpecPtr driver, Handle papaH, long structVersion, PrinterPPDInfo *ppdInfo); /* 'driver' Ç‚ 'papaH' Ç≈éwíËÇ≥ÇÍÇΩÉvÉäÉìÉ^Çà PPD èÓïÒÇï‘ǵNjÇ∑ÅB PPD èÓïÒÇÕ *'ppdInfo' Ç…ï‘ǵNjÇ∑ÅB åƒÇ—èoǵë§ÇÕégópÇ∑ÇÈ PrinterPPDInfo ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇìnÇ≥Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB DZÇÍÇÕíËêîÇà 'kPPDInfoStructVersion' Ç≈Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB åƒÇ—èoǵë§ÇÃç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇ™çáÇÌǻǢÇΔ 'errWrongStructVersion' Çï‘ǵNjÇ∑ÅB */ Å@ OSStatus psSetPPDInfo(FSSpecPtr driver, Handle papaH, long structVersion, PrinterPPDInfo *ppdInfo); /* PPD ÉtÉ@ÉCÉãÇΔÅA'driver' Ç‚ 'papaH' Ç≈éwíËÇ≥ÇÍÇΩÉvÉäÉìÉ^Çà âêÕçœÇ› PPD ÉtÉ@ÉCÉãÇê›íËǵNjÇ∑ÅB PPD ÉtÉ@ÉCÉãÇà FFSpec ÇΔâêÕçœÇ› PPD ÉtÉ@ÉCÉãÇÕÅAîƒópÇà PPD ÇégǧÇ◊ǴǩǫǧǩÇéwé¶ Ç∑ÇÈÉtÉâÉOÇΔÇΔLJDžÅAppdinfo ÇÃéwÇ∑ç\ë¢ëÃÇ≈ìnÇ≥ÇÍÇ‹Ç∑ÅB îƒóp PPD ÉtÉâÉOÇ™ê›íËÇ≥ÇÍǃǢÇÈèÍçáÇÕÅAâêÕ PPD Çà FFSpec ÇæÇØÇ™óLå¯Ç≈džÇÍÇŒè\ï™Ç≈Ç∑ÅB structVersion ÇÕåƒÇ—èoǵë§Ç™égópǵǃǢÇÈ PrinterPPDInfo ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇé¶ÇµÇ‹Ç∑ÅB åƒÇ—èoǵë§ÇÕíËêîÇìnÇ≥Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB */ Å@ OSErr ppdGetParseFolder(FSSpecPtr parseFolder); /* parseFolder Ç™éwÇ∑ FFSpec Ç…âêÕçœÇ› PPD ÉtÉHÉãÉ_Çà 'vRefNum' ÇΔ 'parID' Çê›íËǵNjÇ∑ÅB ÉNÉâÉCÉAÉìÉgÇÕâêÕçœÇ› PPD ÉtÉ@ÉCÉãñºÇ FFSpec Çà 'name' ÉtÉBÅ[ÉãÉhÇ…ê›íËǵÅAÉtÉ@ÉCÉã É}ÉlÅ[ÉWÉÉÇà Open åƒÇ—èoǵÇ≈âêÕçœÇ› PPD ÇäJÇ≠DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB *'parseFolder' ÇÕâêÕçœÇ› PPD ÉtÉHÉãÉ_Çà FFSpec Ç≈ÇÕǻǢDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB */ Å@ OSErr ppdParseFile (const FSSpec *ppdFileSpec, short compiledRef, short compiledResFRef, PPDParseErr *errInfoP); /* PPD ÉtÉ@ÉCÉãÇ®ÇÊÇ—Ç∑Ç◊ǃÇà include ÇâêÕǵNjÇ∑ÅB FFSpecPtr ÇÕèIóπéûÇ…ÉNÉçÅ[ÉYÇ≥ÇÍÇ‹Ç∑ÅB PDD ÉtÉ@ÉCÉãÇÃâêÕåãâ ÇÕÉtÉ@ÉCÉãéQèΔÇà 'compiledRef' Ç≈äJÇ¢ÇΩÉtÉ@ÉCÉãÇ…èoóÕÇ≥ÇÍÇ‹Ç∑ÅB compiledResFRef Ç™ -1 Ç≈ǻǢÇΔÅAPPD ÉtÉ@ÉCÉãÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇǪDZDžÉRÉsÅ[ǵNjÇ∑ÅB 'errInfoP' Ç™ NULL à»äOÇæÇΔÅAÉGÉâÅ[èÓïÒǙdžÇÍÇŒÅA*'errInfoP' Ç…ï‘ǵNjÇ∑ÅB */ Å@ enum PPDPresetSource { kPPDSourceUnknown = -1, kPPDSourceRSRC = 0, kPPDSourceGeneric = 1, kPPDSourceCustom = 2 }; Å@ typedef enum{ kTriFalse = 0, kTriTrue, kTriUnknown } TriState; Å@ struct CustPPDInfo { Boolean usePPD; FSSpec fileSpec; }; typedef struct CustPPDInfo CustPPDInfo, **CustPPDHandle; Å@ typedef struct { short presetSource; /* enum PPDPresetSource */ TriState isSetup; CustPPDInfo customPPD; } WhatPPD; Å@ typedef struct PrinterPPDInfo{ long structVersion; // ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇé¶Ç∑ Boolean useGenericPPD; // îƒóp PPD ÇégópÇ∑ÇÈèÍçáÇÕ True FSSpec ppdFile; // åªç›Çà PPD ÉtÉ@ÉCÉãÇà FSSpec FSSpec parsedPPDFile; // ÉvÉäÉìÉ^ÇÃâêÕçœÇ› PPD ÉtÉ@ÉCÉãÇà FSSpec }PrinterPPDInfo; Å@ /* DZÇÃÉãÅ[É`ÉìÇÕÅAppdFsSpec Ç…ÇÊǡǃéwíËÇ≥ÇÍÇΩ ppd ÉtÉ@ÉCÉãÇâêÕǵÅA ëŒâûÇ∑ÇÈÉqÉìÉgÇ papaH Ç…ÇÊǡǃéwíËÇ≥ÇÍÇΩ DTP Ç…í«â¡ÇµÇ‹Ç∑ÅB */ OSErr SetPPD(FSSpec* ppdFsSpecP, Handle papaH, FSSpec* laserWriterFsSpecP) { OSErr err = noErr; FSSpec parsedPPD; WhatPPD whatPPD; short savedResFile = ::CurResFile(); Boolean isGeneric = false; short dataForkRefNum, resourceForkRefNum; PrinterPPDInfo ppdInfo; Å@ // ÉfÉtÉHÉãÉg whatPPD.presetSource = kPPDSourceCustom; whatPPD.isSetup = kTriTrue; whatPPD.customPPD.usePPD = TRUE; whatPPD.customPPD.fileSpec = *ppdFsSpecP; Å@ // âêÕçœÇ› PPD Çà FSSpec ÇÃèÄîı err = ppdGetParseFolder(&parsedPPD); ThrowIfOSErr_(err); CopyPStr(ppdFsSpecP->name, parsedPPD.name, sizeof(parsedPPD.name)); Å@ // âêÕçœÇ›ÉtÉ@ÉCÉãÇçÏê¨ÇµÅAÉäÉ\Å[ÉXÅ^ÉfÅ[É^ÉtÉHÅ[ÉNÇäJÇ≠ FSpCreateResFile(&parsedPPD, 'vgrd', 'Pref', smSystemScript); err = SpOpenDF(&parsedPPD, fsRdWrPerm, &dataForkRefNum); resourceForkRefNum = ::FSpOpenResFile(&parsedPPD, fsRdWrPerm); // PPD ÇÃâêÕ err = ppdParseFile (ppdFsSpecP, dataForkRefNum, resourceForkRefNum, NULL); // ÉäÉ\Å[ÉXÅ^ÉfÅ[É^ÉtÉHÅ[ÉNÇï¬Ç∂ÇÈ CloseResFile(resourceForkRefNum); err = FSClose(dataForkRefNum); UseResFile(savedResFile); Å@ // PPD ÇÉvÉäÉìÉ^ÇΔåãçá err = addHint(papaH, 'pppd', 1, sizeof(parsedPPD), &parsedPPD); err = addHint(papaH, 'ppd ', 1, sizeof(whatPPD), &whatPPD); // ÉfÉtÉHÉãÉgÉqÉìÉgÇê›íË err = psGetPPDInfo(laserWriterFsSpecP, papaH, 2, &ppdInfo); if(!err) err = psSetPPDInfo(laserWriterFsSpecP, papaH, 2, &ppdInfo); Å@ return (err); }
Å@
PAP DTP óp LaserWriterExtra ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB
// --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inZone, ConstStr32Param inPrinterName) { OSErr err; short refNum; Handle papaH; short savedResFile = CurResFile(); SSpec ppdFsSpec; Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX // SettingsLib édólèëÇà psSetPapPapa ÇéQèΔ err = psSetPapPapa(papaH, inPrinterName, (const Byte *)("\pLaserWriter"), inZone, 0); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); }
Å@
LPR DTP Ç…ÇÕÉhÉÅÉCÉìÉAÉhÉåÉXÇΔÉLÉÖÅ[ÇéwíËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÍÇÁÇÕ 'LpIa' ÉqÉìÉgÇΔǵǃéwíËǵNjÇ∑ÅB'LpIa' ÇÃÉtÉHÅ[É}ÉbÉgÇÕÅAÉvÉäÉìÉ^ÇÃÉhÉÅÉCÉìÉAÉhÉåÉX (ÉpÉXÉJÉãï∂éöóÒ) Ç…ë±ÇØÇƒÉLÉÖÅ[ÇÃñºëO (ÉpÉXÉJÉãï∂éöóÒ) ÇǬǻÇ∞ÇΩå`éÆÇ≈Ç∑ÅB
LPR DTP óp LaserWriterExtra ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB
// --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // inTcpAddr ÇÕ LPR ÉvÉäÉìÉ^ÇÃÉlÉbÉgÉèÅ[ÉNÉAÉhÉåÉXÇ≈Ç∑ÅB // DZÇÃÉAÉhÉåÉXÇÕÅAñºëOÇÃå`éÆÇ≈LJÉhÉbÉgå`éÆÇ≈LJéwíËÇ≈Ç´Ç‹Ç∑ÅB // ó·Ç¶ÇŒ "\plaser.rbi.com" Ç‹ÇΩÇÕ "\p204.188.109.155" ÇΔÇ»ÇËÇ‹Ç∑ÅB // inQName ÇÕ inTcpAddr ÇÃÉXÉvÅ[ÉâÇ…äÑÇËìñǃÇÁÇÍÇΩÉvÉäÉìÉgÉLÉÖÅ[Çà // ñºëOÇ≈Ç∑ÅBinQName Ç™ NULL ÇæÇΔÅAÉvÉäÉìÉ^Å^ÉXÉvÅ[ÉâÇÃÉfÉtÉHÉãÉgÇà // ÉLÉÖÅ[ÇégópǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inTcpAddr, ConstStr32Param inPrinterName, ConstStr32Param inQName) { OSErr err; short refNum; Handle papaH; Handle ipAddrQueueH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX // SettingsLib édólèëÇà psSetLprPapa ÇéQèΔ err = psSetLprPapa(papaH, inPrinterName, (const Byte *)("\p=LPR"), (const Byte *)(*inTcpAddr), (const Byte *)inQName); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ // ÉvÉäÉìÉ^ÇÃÉhÉÅÉCÉìÉAÉhÉåÉXÇΔÉLÉÖÅ[ÇéwíË err = PtrToHand(inTcpAddr, &ipAddrQueueH, inTcpAddr[0] + 1); err = PtrAndHand(inQName, ipAddrQueueH, inQName[0] + 1); HLock(ipAddrQueueH); err = addHint(papaH, 'LpIa', 1, GetHandleSize(ipAddrQueueH), *ipAddrQueueH); HUnlock(ipAddrQueueH); DisposHandle(ipAddrQueueH); Å@ ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); }
Å@
// --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inPrinterName) { OSErr err; short refNum; Handle papaH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX // SettingsLibédólèëÇÃpsSetInfraredPapaÇéQèΔ err = psSetInfraredPapa(papaH, inPrinterName, ("\p=Ird")); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); } Å@
// --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inPrinterName) { OSErr err; short refNum; Handle papaH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX // See SettingsLib Spec for psSetHoldPapa err = psSetHoldPapa(papaH, inPrinterName, ("\p=Hld")); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); } Å@
PostScript ÉgÉâÉìÉXÉåÅ[É^ DTP ÇÃèÍçáÅAïœä∑çœÇÃÉtÉ@ÉCÉãÇï€ë∂Ç∑ÇÈÉfÉtÉHÉãÉgÇÃäiî[êÊÉtÉHÉãÉ_Ç 'Pdka' ÉqÉìÉgÇΔǵǃéwíËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÅuÉtÉ@ÉCÉãÇ…àÛç¸ÅvÇ∑ÇÈDZÇΔÇé¶Ç∑ÇΩÇflÅA'Svap' LJéwíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
struct SaveAsFilePrefs{ Boolean saveToFile; // ÉtÉ@ÉCÉãÇ…àÛç¸Ç∑ÇÈèÍçáÇÕ True Boolean restricted; // ÉtÉ@ÉCÉãÇ…àÛç¸Ç∑ÇÈèÍçáÇÕ True }; Å@ // --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inPrinterName, FSSpec* destinationFolderP) { OSErr err; short refNum; Handle papaH; SaveAsFilePrefs saveToFilePref; AliasHandle printToDiskAliasH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX // SettingsLib édólèëÇà psSetFilePapa err = psSetFilePapa(papaH, inPrinterName, "\p=Fil"); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ // ÉfÉBÉXÉNÉqÉìÉgÇ÷àÛç¸ saveToFilePref.saveToFile = TRUE; saveToFilePref.restricted = TRUE; prefCollection.AddItem('Svap', 1, sizeof(saveToFilePref), &saveToFilePref); Å@ // ÉfÉBÉXÉNÇÃÉfÉtÉHÉãÉgÉtÉHÉãÉ_Ç…àÛç¸Ç∑ÇÈÇÊǧê›íË err = NewAliasMinimal(destinationFolderP, &printToDiskAliasH); HLock((Handle)printToDiskAliasH); err = addHint(papaH, 'Pdka', 1, GetHandleSize((Handle)printToDiskAliasH), *printToDiskAliasH); HUnlock((Handle)printToDiskAliasH); DisposeHandle((Handle)printToDiskAliasH); Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); } Å@
ÉfÉxÉçÉbÉpÇ™ÉJÉXÉ^ÉÄ DTP ÇégópÇ∑ÇÈï˚ñ@ÇΔÅAÉAÉbÉvÉãÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇïœçXǵǃì¡íËÇÃå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃé¿çsÇÉTÉ|Å[ÉgÇ∑ÇÈï˚ñ@ÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
ÉJÉXÉ^ÉÄ DTP Ç…ÇÕǪÇÍǺÇÍÅALaserWriter Ç™ãNìÆÇ∑ÇÈå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇéwíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕ AliasHandle ÇΔǵǃÅA'TGap' ÉqÉìÉgì‡Ç…éwíËǵNjÇ∑ÅB
åªç›ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈÉJÉXÉ^ÉÄ DTP ÇÃÉqÉìÉgÇÕÅA'PSlv'ÅA'BNok'ÅA'JObt'ÅA'FOnt' Ç≈Ç∑ÅBDZÇÍÇÁÇÃÉqÉìÉgÇÃà”ñ°ÇΔÉfÅ[É^ç\ë¢ëÃDžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇ≈ê‡ñæÇµÇƒÇ¢Ç‹Ç∑ÅB
éüÇÃÉãÅ[É`ÉìÇÕDZǧǵÇΩÉpÉâÉÅÅ[É^ÇÉJÉXÉ^ÉÄ DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…í«â¡Ç∑ÇÈï˚ñ@Çé¶ÇµÇΩLJÇÃÇ≈Ç∑ÅBFOntHint Ç®ÇÊÇ— CustomAppDesc ç\ë¢ëÃÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
typedef struct{ // ÅuÉJÉXÉ^ÉÄ DTPÅvÇÃê‡ñæÇéQèΔ long flag; // kIncludeAllFontsBut Ç‹ÇΩÇÕ kIncludeAllFontsBut unsigned char name[1]; // ÉtÉHÉìÉgñº }FOntHint; Å@ struct CustomAppDesc{ OSType appSignature; // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉVÉOÉlÉ`ÉÉ Str255 docType; // êVãKÉÅÉjÉÖÅ[ÇÃï∂èëÉäÉXÉgÇ…èoÇ∑ñºëO Str255 helpText; // lin43 - DZÇÃÉ^ÉCÉvÇà DTP Ç™ëIëÇ≥ÇÍÇΩÇΔÇ´Ç…èoÇ∑ Str255 usage; // ÉEÉBÉìÉhÉEÇ…èoÇ∑ DTP óòópèÛãµ Str255 appFileName; // ÉGÉâÅ[ÉÅÉbÉZÅ[ÉWǻǫÇ≈égÇÌÇÍÇÈÉfÉtÉHÉãÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÉtÉ@ÉCÉãñº short numOfHintsFollow; // 1 Ç©ÇÁénÇ‹ÇÈ HintRsrcSpec hintRsrc[1]; // â¬ïœí∑ }; typedef struct CustomAppDesc CustomAppDesc; typedef struct CustomAppDesc* CustomAppDescPtr; typedef struct CustomAppDesc** CustomAppDescHdl; Å@ /* DZÇÃÉãÅ[É`ÉìÇÕÉJÉXÉ^ÉÄ DTP ÇÃÉqÉìÉgÇ DTP ÇéwíËÇ∑ÇÈ papaH Ç…í«â¡ÇµÇ‹Ç∑ÅB ppApp ÇÕå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà FSSpec ÇéwǵNjÇ∑ÅB å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà AliasHandle ÇÃê∂ê¨ñ@ÇΔÅA'TGap' ÉqÉìÉgÇΔǵǃí«â¡Ç∑ÇÈï˚ñ@Ç…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅB */ OSErr addCustomDtpParameters(FSSpec* ppApp, Handle papaH) { OSErr err; long psLevel = 1; // PostScript ÉåÉxÉã 1 Byte binaryOK = 0; // false char job = 0; // psJobPostScript FOntHint fontHint; AliasHandle targetAppAliasH; CustomAppDesc customAppDesc; Å@ // PostScript ÉåÉxÉã 1 err = addHint(papaH, 'PSlv', 1, siezof(psLevel ), &psLevel ){ // ÉoÉCÉiÉäÇÕégópǵǻǢ err = addHint(papaH, 'BNok', 1, siezof(binaryOK ), &binaryOK ){ // PostScript ÉWÉáÉu err = addHint(papaH, 'JObt', 1, siezof(job ), &job ){ // includeAllFonts fontHint.flag = 1; fontHint.name [0] = 0; err = addHint(papaH, 'FOnt', 1, siezof(fontHint), &fontHint){ Å@ // É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍèäÇï€ë∂ err = ::NewAliasMinimal(ppApp, &targetAppAliasH); // ÉGÉâÅ[èàóù ::HLock((Handle)targetAppAliasH); err = addHint('TGap', 1, GetHandleSize((Handle)targetAppAliasH), *targetAppAliasH); ::HUnlock((Handle)targetAppAliasH); ::DisposeHandle((Handle)targetAppAliasH); Å@ // ÉAÉbÉvÉãÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇ… DTP ÇîFéØÇµÇƒÇ‡ÇÁÇ¢ÅA // äJǢǃLJÇÁǧÇΩÇflÇ…ÇÕÅA'CsDs' ÉqÉìÉgÇí«â¡ÇµÇ»ÇØÇÍnjǻÇÁǻǢ Å@ // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà customAppDesc ç\ë¢ëÃÇÃÉtÉBÅ[ÉãÉhÇê›íË customAppDesc.appSignature = 'xxxx'; // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉVÉOÉiÉ`ÉÉ /* ǪÇÃëºÇÃÉtÉBÅ[ÉãÉhLJÇ∑Ç◊ǃ */ // ÉJÉXÉ^ÉÄÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃê‡ñæÇï€ë∂ err = addHint(('CsDs', 1, sizeof(customAppDesc), &customAppDesc); return err; } Å@ // --------------------------------------------------------------------------- // LaserWriter 8.5.1 óp LaserWriterExtra // åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB // --------------------------------------------------------------------------- LaserWriterExtra(FSSpec *printerDrvrFsSpecP, ConstStr32Param inPrinterName) { OSErr err; FSSpec postProcessAppFsSpec; short refNum; Handle papaH; short savedResFile = CurResFile(); Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠ err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum); // ÉGÉâÅ[èàóù Å@ // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ papaH= Get1Resource('PAPA' , -8192); // ÉGÉâÅ[èàóù Å@ // SettingsLib édólèëÇà psSetCustomPapa ÇéQèΔ err = psSetCustomPapa(papaH, inPrinterName, "\p=Cst"); // ÉGÉâÅ[èàóù Å@ // PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec); err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP); Å@ // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔëºÇÃÉpÉâÉÅÅ[É^ÇéwíË err = FSMakeFSSpec(vRefNum, dirID, "\pYourPostProcessAppName", &postProcessAppFsSpec); err = addCustomDtpParameters(&postProcessAppFsSpec, papaH); Å@ // PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑ WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV err = FSClose(refNum); UseResFile(savedResFile); } Å@
DZÇà TECHNOTE Ç≈äTê‡ÇµÇΩÇÊǧDžÅAÉvÉçÉOÉâÉÄÇÃé¿çsíÜÇ…ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈÇ…ÇÕÇøÇÂÇ¡ÇΔǵÇΩçÏãΔÇ™ïKóvÇ≈Ç∑ÅBǵǩǵÅADZDZÇ≈é¶ÇµÇΩíçà”ÇéÁǡǃçsǶnjÅAëΩÇ≠ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇΔǡǃÅAâøíldžÇÈçÏãΔÇΔÇ»ÇÈÇÕÇ∏Ç≈Ç∑ÅBÇ™ÇÒnjǡǃÇ≠ÇæÇ≥Ç¢ÅB
Å@